package com.atguigu.day72_demo;

import java.util.*;
import java.util.concurrent.CopyOnWriteArraySet;

public class NotSafeDemo {
    public static void main(String[] args) {
        Map<String, String> hashMap = Collections.synchronizedMap(new HashMap<>());
        for (int i = 1; i <50 ; i++) {
            new Thread(()->{
                hashMap.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,6));
                System.out.println(hashMap);
            },String.valueOf(i)).start();
        }
    }


    private static void HashSetNotSafe() {
        // HashSet<String> hashSet = new HashSet<>();
        // Set<String> hashSet = Collections.synchronizedSet(new HashSet<>());
        Set<String> hashSet = new CopyOnWriteArraySet<>();
        for (int i = 1; i <50 ; i++) {
            new Thread(()->{
                hashSet.add(UUID.randomUUID().toString());
                System.out.println(hashSet);
            },String.valueOf(i)).start();
        }
    }

    private static void listNotSafe() {
        ArrayList<String> arrayList = new ArrayList<>();

        for (int i = 1; i <=100 ; i++) {
            new Thread(()->{
                arrayList.add(Thread.currentThread().getName()+UUID.randomUUID().toString());
                System.out.println(arrayList);
            },String.valueOf(i)).start();
        }
    }
}

//Exception in thread "52" java.util.ConcurrentModificationException


/**
 * 自己个人积累的修炼，自己的错题集，自己的技术积累
 * <p>
 * 1 故障现象
 * 2 导致原因
 * 3 解决方案
 * 4 优化建议
 */












/*CopyOnWrite容器即写时复制的容器。往一个容器添加元素的时候，不直接往当前容器Object[]添加，
        而是先将当前容器Object[]进行Copy，复制出一个新的容器Object[] newElements，
        然后向新的容器Object[] newElements里添加元素。
        添加元素后，再将原容器的引用指向新的容器setArray(newElements)。
        这样做的好处是可以对CopyOnWrite容器进行并发的读，而不需要加锁，因为当前容器不会添加任何元素。
        所以CopyOnWrite容器也是一种读写分离的思想，读和写不同的容器。*/

